home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / eulisp / you-075a.lha / you-075a / initcode.em < prev    next >
Lisp/Scheme  |  1992-11-02  |  17KB  |  549 lines

  1. ;; Eulisp Module
  2. ;; Author: pab
  3. ;; File: initcode.em
  4. ;; Date: Mon Dec  9 22:36:26 1991
  5. ;;
  6. ;; Project:
  7. ;; Description: 
  8. ;;
  9.  
  10. (defmodule initcode
  11.   (threads arith calls symbols strings characters list-operators
  12.    streams vectors lists ccc tables classes (rename ((null Null)) class-names) errors
  13.    generics others module-operators formatted-io 
  14.    root ) 
  15.   ()
  16.  
  17.   ;; install the callbacks
  18.  
  19.   
  20.   ;; define add-method
  21.  
  22.   (defun simple-add-method (gf meth)
  23.     ((lambda (sig table)
  24.        (if (null table)
  25.        (generic-method-table-setter gf (mk-initial-table sig (list meth)))
  26.      (add-meth-aux table sig (list meth)))
  27.        ;;(if (methodp (car (find-applicable-methods gf sig)))
  28.        ;;nil
  29.        ;;(cerror  (find-applicable-methods gf sig) nil))
  30.        ;; invalidate cache
  31.        (generic-fast-method-cache-setter gf nil)
  32.        (generic-slow-method-cache-setter gf nil)
  33.        gf)
  34.      (method-signature meth)
  35.      (generic-method-table gf)))
  36.   
  37.   (defun add-method-method (h1 h2 gf meth)
  38.     (simple-add-method gf meth))
  39.  
  40.   (defun mk-initial-table (initkey initentry)
  41.     (fold (lambda (class tab)
  42.         (cons (cons class tab) nil))
  43.       (reverse initkey)
  44.       initentry))
  45.  
  46.   ;; starting this lot up...
  47.   
  48.   (defun add-meth-aux (table sig meth)
  49.     ((lambda (xx)
  50.        (if (null table)
  51.        ;; should never happen
  52.        (swizzle)
  53.      (if (null xx)
  54.          (progn (nconc table
  55.                (fold (lambda (class tab)
  56.                    (cons (cons class tab) nil))
  57.                  (reverse sig)
  58.                  meth))
  59.             table)
  60.        (if (null (cdr sig))
  61.            ;; must have a relacement method
  62.            ((setter cdr) xx meth)
  63.          (add-meth-aux (cdr xx) (cdr sig) meth)))))
  64.      (my-assq (car sig) table)))
  65.  
  66.   (defun add-method-to-slow-cache (gf sig meths)
  67.     ((lambda (table)
  68.        (if (null table)
  69.        (generic-slow-method-cache-setter 
  70.         gf 
  71.         (mk-initial-table sig (cons sig meths)))
  72.      (add-meth-aux table sig (cons sig meths)))
  73.        table)
  74.      (generic-slow-method-cache gf)))
  75.  
  76.   (defun find-applicable-methods (gf args)
  77.     (find-applic-methods-aux (generic-method-table gf)
  78.                  (mapcar (lambda (x)
  79.                        (class-precedence-list (class-of x)))
  80.                      args)))
  81.   
  82.   (export find-applicable-methods)
  83.   ;; wasteful...
  84.   (defun find-applic-methods-aux (table cpl-lst)
  85.     (if (null cpl-lst)
  86.     nil
  87.       (if (null (car cpl-lst))
  88.       nil
  89.     ((lambda (xx)
  90.        (if (null xx)
  91.            (find-applic-methods-aux table
  92.                     (cons (cdr (car cpl-lst))
  93.                           (cdr cpl-lst)))
  94.          (if (null (cdr cpl-lst))
  95.          ;; found summat
  96.          (if (methodp (car (cdr xx)))
  97.              (cons (car (cdr xx))
  98.                            (find-applic-methods-aux table
  99.                                                     (cons (cdr (car cpl-lst))
  100.                                                           (cdr cpl-lst))))
  101.            (progn (print "error-1")
  102.               (print (list xx cpl-lst))
  103.               (print "error-1")
  104.               (print (list xx cpl-lst))
  105.               nil))
  106.            (append (find-applic-methods-aux (cdr xx) (cdr cpl-lst))
  107.                (find-applic-methods-aux table
  108.                         (cons (cdr (car cpl-lst))
  109.                               (cdr cpl-lst)))))))
  110.      (my-assq (car (car cpl-lst)) table)))))
  111.       
  112.   (defun find-and-call-generic (gf args)
  113.     (find-and-call-generic-1 gf args (mapcar class-of args)))
  114.   
  115.   (defun find-and-call-generic-1 (gf args sig)
  116.     ((lambda (meths)
  117.        (if (null meths) 
  118.        (progn (setq x (list gf sig args))
  119.           (error "No applicable method" Internal-Error 
  120.              'error-value (list gf sig)))
  121.      (progn (add-method-to-slow-cache gf sig meths)
  122.         (generic-fast-method-cache-setter gf 
  123.                           (cons sig meths))
  124.         (if (methodp (car meths))
  125.             (call-method-by-list meths args)
  126.           (cerror meths nil)))))
  127.      ((generic-discriminator gf) args)))
  128.   
  129.   ;; use this at bootstrap...
  130.   (defun default-compute-discriminating-function (gf)
  131.     (lambda (sig)
  132.       (find-applicable-methods gf sig)))
  133.   
  134.   (defun compute-discriminating-function-as-method (foo bar gf)
  135.     (lambda (args)
  136.       (find-applicable-methods gf args)))
  137.  
  138.   ;; add as a method...
  139.  
  140.   ;; necessary functions
  141.   
  142.   (defun fold (fn lst val)
  143.     (if (null lst) val
  144.       (fold fn (cdr lst)
  145.         (fn (car lst) val))))
  146.   
  147.   (defun reverse (x)
  148.     (fold cons x nil))
  149.  
  150.   (defun my-mapcar (fn lst)
  151.     (if (null lst) nil
  152.       (cons (fn (car lst))
  153.         (mapcar fn (cdr lst)))))
  154.  
  155.   (defun my-assq (obj lst)
  156.     (if (null lst) nil
  157.       (if (eq (car (car lst)) obj) 
  158.       (car lst)
  159.     (my-assq obj (cdr lst)))))
  160.  
  161.   ;; Should have enough in place now...
  162.  
  163.   (set-compute-and-apply-fn find-and-call-generic)
  164.  
  165.   ;; very much hacked up bootstrap
  166.   
  167.   (defun init-generic (gf)
  168.     (generic-discriminator-setter gf
  169.                   (default-compute-discriminating-function gf)))
  170.   
  171.   ;; bung in the discriminators...
  172.   (init-generic allocate-instance)
  173.   (init-generic initialize-instance)
  174.   (init-generic compute-discriminating-function)
  175.   (init-generic add-method)
  176.   (init-generic compute-class-precedence-list)
  177.   (init-generic slot-value-using-class)
  178.   (init-generic (setter slot-value-using-class))
  179.   (init-generic slot-value-using-slot-description)
  180.   (init-generic (setter slot-value-using-slot-description))
  181.   (init-generic find-slot-description)
  182.   (init-generic make-slot-description)
  183.   (init-generic make-inherited-slot-description)
  184.   (init-generic add-slot-description)
  185.   (init-generic generic-write)
  186.   (init-generic generic-prin)
  187.   (init-generic binary-plus)
  188.   (init-generic binary-times)
  189.   (init-generic binary-difference)
  190.   (init-generic binary-divide)
  191.   (init-generic binary-gcd)
  192.   (init-generic binary-lcm)
  193.   (init-generic binary-lcm)
  194.   (init-generic =)
  195.   (init-generic zerop)
  196.   (init-generic abs)
  197.   (init-generic binary-lt)
  198.   (init-generic binary-gt)
  199.   (init-generic equal)
  200.   (init-generic copy)
  201.  
  202.   (simple-add-method allocate-instance 
  203.           (generic_initialize_instance\,Method
  204.            (generic_allocate_instance\,Method_Class method nil)
  205.            (list 'signature (list method-class object)
  206.              'function generic_allocate_instance\,Method_Class)))
  207.           
  208.  
  209.   (simple-add-method initialize-instance 
  210.           (generic_initialize_instance\,Method
  211.            (generic_allocate_instance\,Method_Class method nil)
  212.            (list 'signature (list method object)
  213.              'function generic_initialize_instance\,Method)))
  214.           
  215.   (simple-add-method add-method
  216.           (generic_initialize_instance\,Method
  217.            (generic_allocate_instance\,Method_Class method nil)
  218.            (list 'signature (list generic-function method)
  219.              'function add-method-method)))
  220.           
  221.   ;; should be enough
  222.   (add-method allocate-instance
  223.           (make-instance method
  224.                  'signature (list class object)
  225.                  'function
  226.                  generic_allocate_instance\,StandardClass))
  227.  
  228.   (add-method allocate-instance 
  229.           (generic_initialize_instance\,Method
  230.            (generic_allocate_instance\,Method_Class method nil)
  231.            (list 'signature (list generic-class object)
  232.              'function generic_allocate_instance\,Generic_Class)))
  233.  
  234.   (add-method initialize-instance 
  235.           (generic_initialize_instance\,Method
  236.            (generic_allocate_instance\,Method_Class method nil)
  237.            (list 'signature (list generic-function object)
  238.              'function generic_initialize_instance\,Generic)))
  239.  
  240.   (add-method allocate-instance
  241.           (make-instance method
  242.                  'signature (list structure-class object)
  243.                  'function
  244.                  generic_allocate_instance\,StructureClass))
  245.  
  246.   (add-method allocate-instance
  247.           (make-instance method
  248.                  'signature (list slot-description-class object)
  249.                  'function
  250.                  generic_allocate_instance\,Slot_Description_Class))
  251.  
  252.   (add-method allocate-instance
  253.           (make-instance method
  254.                  'signature (list condition-class object)
  255.                  'function
  256.                  generic_allocate_instance\,Condition_Class))
  257.  
  258.   (add-method allocate-instance 
  259.           (make-instance method
  260.                  'signature (list primitive-class object)
  261.                  'function
  262.                  generic_allocate_instance\,Primitive_Class))
  263.  
  264.   (add-method initialize-instance 
  265.           (make-instance method
  266.                  'signature (list object object)
  267.                  'function
  268.                  generic_initialize_instance\,Object))
  269.  
  270.   (add-method initialize-instance
  271.           (make-instance method
  272.                  'signature (list class object)
  273.                  'function 
  274.                  generic_initialize_instance\,Standard_Class))
  275.  
  276.   (add-method initialize-instance 
  277.           (make-instance method
  278.                  'signature (list slot-description object)
  279.                  'function
  280.                  generic_initialize_instance\,Slot_Description))
  281.  
  282.   (add-method initialize-instance 
  283.           (make-instance method
  284.                  'signature (list condition object)
  285.                  'function
  286.                  generic_initialize_instance\,Default_Condition))
  287.   ;; More initting
  288.   (add-method compute-class-precedence-list
  289.           (make-instance method
  290.                  'signature (list class)
  291.                  'function generic_compute_class_precedence_list\,Standard_Class))
  292.  
  293.  
  294.   ;; slot access
  295.  
  296.   (add-method slot-value-using-class
  297.           (make-instance method
  298.                  'signature (list class object object)
  299.                  'function generic_slot_value_using_class\,Standard_Class))
  300.  
  301.   (add-method slot-value-using-class
  302.           (make-instance method
  303.                  'signature (list structure-class object object)
  304.                  'function generic_slot_value_using_class\,Structure_Class))
  305.  
  306.   
  307.   (add-method (setter slot-value-using-class)
  308.           (make-instance method
  309.                  'signature (list class object object object)
  310.                  'function generic_slot_value_using_class_setter\,Standard_Class))
  311.  
  312.   (add-method (setter slot-value-using-class)
  313.           (make-instance method
  314.                  'signature (list structure-class object object object)
  315.                  'function generic_slot_value_using_class_setter\,StructureClass))
  316.  
  317.   (add-method slot-value-using-slot-description
  318.           (make-instance method 
  319.                  'signature (list object local-slot-description)
  320.                  'function 
  321.                  generic_slot_value_using_slot_description\,Object\,Local_Slot_Description))
  322.  
  323.   (add-method slot-value-using-slot-description
  324.           (make-instance method 
  325.                  'signature (list object local-slot-description)
  326.                  'function 
  327.                  generic_slot_value_using_slot_description\,Object\,Local_Slot_Description))
  328.  
  329.   (add-method (setter slot-value-using-slot-description)
  330.           (make-instance method 
  331.                  'signature (list object local-slot-description object)
  332.                  'function ;; should have been called fred.
  333.                  generic_slot_value_using_slot_description_setter\,Object\,Local_Slot_Description))
  334.   
  335.   (add-method find-slot-description 
  336.           (make-instance method
  337.                  'signature (list structure-class object)
  338.                  'function generic_find_slot_description\,Structure_Class))
  339.  
  340.   (add-method find-slot-description 
  341.           (make-instance method
  342.                  'signature (list class object)
  343.                  'function generic_find_slot_description\,Standard_Class))
  344.  
  345.   (add-method make-slot-description 
  346.           (make-instance method 
  347.                  'signature (list class object)
  348.                  'function generic_make_slot_description\,Standard_Class))
  349.  
  350.   (add-method make-inherited-slot-description
  351.           (make-instance method
  352.                  'signature (list class slot-description object)
  353.                  'function
  354.                  generic_make_inherited_slot_description\,Standard_Class\,Slot_Description))
  355.  
  356.   (add-method add-slot-description
  357.           (make-instance method
  358.                  'signature (list class slot-description)
  359.                  'function generic_add_slot_description\,StandardClass\,SlotDescription))
  360.  
  361.   
  362.   (add-method add-slot-description
  363.           (make-instance method
  364.                  'signature (list class local-slot-description)
  365.                  'function 
  366.                  generic_add_slot_description\,StandardClass\,LocalSlotDescription))
  367.  
  368.   
  369.   
  370.   ;; streams
  371.  
  372.   (add-method generic-write 
  373.           (make-instance method
  374.                  'signature (list object object)
  375.                  'function generic_generic_write\,Object))
  376.   (add-method generic-prin
  377.           (make-instance method
  378.                  'signature (list object object)
  379.                  'function generic_generic_prin\,Object))
  380.  
  381.   (add-method generic-prin
  382.           (make-instance method
  383.                  'signature (list pair object)
  384.                  'function generic_generic_prin\,Cons))
  385.  
  386.   ;; arithmetic...
  387.   
  388.  
  389.   (add-method binary-plus
  390.           (make-instance method
  391.                  'signature (list number number)
  392.                  'function generic_binary_plus\,Number\,Number))
  393.  
  394.   (add-method binary-plus 
  395.           (make-instance method
  396.                  'signature (list integer integer)
  397.                  'function generic_binary_plus\,Integer\,Integer))
  398.  
  399.   (add-method binary-difference
  400.           (make-instance method
  401.                  'signature (list number number)
  402.                  'function generic_binary_difference\,Number\,Number))
  403.  
  404.   (add-method binary-difference 
  405.           (make-instance method
  406.                  'signature (list integer integer)
  407.                  'function generic_binary_difference\,Integer\,Integer))
  408.  
  409.   (add-method binary-times
  410.           (make-instance method
  411.                  'signature (list number number)
  412.                  'function generic_binary_times\,Number\,Number))
  413.  
  414.   (add-method binary-times 
  415.           (make-instance method
  416.                  'signature (list integer integer)
  417.                  'function generic_binary_times\,Integer\,Integer))
  418.  
  419.   (add-method binary-divide
  420.           (make-instance method
  421.                  'signature (list number number)
  422.                  'function generic_binary_divide\,Number\,Number))
  423.  
  424.  
  425.   (add-method binary-gcd 
  426.           (make-instance method
  427.                  'signature (list integer integer)
  428.                  'function generic_binary_gcd\,Integer\,Integer))
  429.  
  430.  
  431.   (add-method binary-lcm 
  432.           (make-instance method
  433.                  'signature (list integer integer)
  434.                  'function generic_binary_lcm\,Integer\,Integer))
  435.  
  436.           
  437.   (add-method =
  438.           (make-instance method
  439.                  'signature (list number number)
  440.                  'function generic_eqn\,Number\,Number))
  441.  
  442.   (add-method equal 
  443.           (make-instance method
  444.                  'signature (list number number)
  445.                  'function generic_equal\,Number\,Number))
  446.  
  447.   (add-method zerop
  448.           (make-instance method
  449.                  'signature (list number )
  450.                  'function generic_zerop\,Number))
  451.  
  452.   (add-method abs
  453.           (make-instance method 
  454.                  'signature (list number)
  455.                  'function generic_abs\,Number))
  456.  
  457.   (add-method binary-lt 
  458.           (make-instance method 
  459.                  'signature (list number number)
  460.                  'function generic_binary_lt\,Number\,Number))
  461.  
  462.   (add-method binary-gt 
  463.           (make-instance method 
  464.                 'signature (list integer integer)
  465.                 'function generic_binary_gt\,Integer\,Integer))
  466.   (add-method binary-lt 
  467.           (make-instance method 
  468.                  'signature (list integer integer)
  469.                  'function generic_binary_lt\,Integer\,Integer))
  470.  
  471.   (add-method binary-gt 
  472.           (make-instance method 
  473.                 'signature (list number number)
  474.                 'function generic_binary_gt\,Number\,Number))
  475.   
  476.   ;; threads
  477.   ;; Note that these 2 only exist in BSD+SYSV versions...
  478.   (if (eq (feel-machine-type) 'generic)
  479.       ()
  480.     (progn (add-method allocate-instance 
  481.                (make-instance method 
  482.                       'signature (list thread-class object)
  483.                       'function generic_allocate_instance\,Thread_Class))
  484.  
  485.  
  486.        (add-method initialize-instance
  487.                (make-instance method 
  488.                       'signature (list thread object)
  489.                       'function  (lambda (x y o i)
  490.                           (initialize-thread o i)
  491.                           (call-next-method))))
  492.  
  493.  
  494.        (add-method generic-prin 
  495.                (make-instance method
  496.                       'signature (list thread object)
  497.                       'function generic_generic_prin\,Thread\,Object))
  498.  
  499.        (add-method generic-write
  500.                (make-instance method
  501.                       'signature (list thread object)
  502.                       'function generic_generic_write\,Thread\,Object))
  503.        ))
  504.   ;; form ccc.c...
  505.   (add-method equal
  506.           (make-instance method
  507.                  'signature (list object object)
  508.                  'function generic_equal\,Object\,Object))
  509.   (add-method equal
  510.           (make-instance method
  511.                  'signature (list pair pair)
  512.                  'function generic_equal\,Cons\,Cons))
  513.   (add-method equal
  514.           (make-instance method
  515.                  'signature (list vector vector)
  516.                  'function generic_equal\,Vector\,Vector))
  517.  
  518.   (add-method equal
  519.           (make-instance method
  520.                  'signature (list structure structure)
  521.                  'function generic_equal\,Basic_Structure\,Basic_Structure))
  522.   (add-method equal
  523.           (make-instance method
  524.                  'signature (list class class)
  525.                  'function generic_equal\,Standard_Class\,Standard_Class))
  526.  
  527.   (add-method copy 
  528.           (make-instance method
  529.                  'signature (list object)
  530.                  'function generic_copy\,Object))
  531.   (add-method copy 
  532.           (make-instance method
  533.                  'signature (list pair)
  534.                  'function generic_copy\,Cons))
  535.   (add-method copy 
  536.           (make-instance method
  537.                  'signature (list vector)
  538.                  'function generic_copy\,Vector))
  539.  
  540.  
  541.   ;; and lastly...
  542.   (add-method compute-discriminating-function 
  543.           (make-instance method
  544.                  'signature (list generic-function)
  545.                  'function compute-discriminating-function-as-method))
  546.  
  547.   ;; end module
  548.   )
  549.